#include "servertcp.h"
#include "ui_servertcp.h"
#include <QDebug>
#include <QTcpSocket>
ServerTcp::ServerTcp(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ServerTcp)
{
    ui->setupUi(this);
    //关联客户连接信号newConnection
    connect(&mserver,&QTcpServer::newConnection,this,&ServerTcp::new_client);

}

ServerTcp::~ServerTcp()
{
    delete ui;
}

void ServerTcp::on_stratBt_clicked()
{
    if(mserver.isListening()){
        mserver.close();
        ui->stratBt->setText("启动服务器");
        return;
    }

    //启动服务器
    QString port = ui->portEdit->text();
    bool flag = mserver.listen(QHostAddress::Any,port.toUShort());
    if(!flag)
    {
        qDebug()<<"监听失败!!";
    }else {
        ui->stratBt->setText("关闭服务器");
    }

}
//接收客户端连接槽函数
void ServerTcp::new_client()
{
    qDebug()<<"有新的客户端连接";
    //创建与客户端通信的套接字
    QTcpSocket *msocket = mserver.nextPendingConnection();

    //当QTcpSocket有数据可读（客户端发送数据过来了）会发送readyRead信号

    connect(msocket,&QTcpSocket::readyRead,this,&ServerTcp::read_data);

    //给客户端生成id号
    QString id = QString::number(qrand());
    clients.insert(id,msocket);

    //发送一段数据给客户端  --（当前所有地客户端id号）
    QList<QString> ids = clients.keys();

    QStringList idlist;
    for(int i = 0;i<ids.size();i++)
    {
        idlist<<ids.at(i); //把QList容器中的字符串一项一项插入到QStringList中
    }
    QString msg = idlist.join(":");
    msg.push_front("id-");  //id-12312321:565655353:56456454（服务器发送给客户端）

    msocket->write(msg.toUtf8());

    for(int i = 0;i<ids.size();i++)  //给所有在线的客户端发送id列表
    {
        clients.value(ids.at(i))->write(msg.toUtf8());
    }
}

//接收客户端发送的数据
void ServerTcp::read_data()
{
    //获取信号发送者
    QTcpSocket *msocket = qobject_cast<QTcpSocket*>(sender());

    //读取数据
    QString data = msocket->readAll(); //id-msg;（客户端发送给服务器）

    QString id = data.split("-").at(0);
    QString msg = data.split("-").at(1);

    //找到接收数据的客户端
    QTcpSocket *recvsocket = clients.value(id);
    recvsocket->write(msg.toUtf8());



}





























